// 思路分析
// 确定搜索范围：
// 最小速度 K：珂珂每小时至少吃 1 根香蕉。
// 最大速度 K：珂珂可以选择最快的方式，即每小时吃 max(piles) 根香蕉（一次吃光最大的一堆）。
// 二分查找最小的 K：
// 设定 left = 1，right = max(piles) 作为搜索范围。
// 计算珂珂在 K 速度下吃完所有香蕉所需的小时数。
// 如果 所需时间 ≤ H，说明 K 可能还可以更小，缩小右边界 right = mid。
// 否则，说明 K 过小，需要增加速度 left = mid + 1。
// 终止条件：left == right 时，找到最小的 K。

/**
 * @param {number[]} piles
 * @param {number} h
 * @return {number}
 */
var minEatingSpeed = function (piles, h) {
    if (!piles || !piles.length || !h) return 0
    let left = 1
    let right = Math.max(...piles)
    const timeRequired = (speed) => {
        let timeResult = 0
        for (const element of piles) {
            const time = Math.ceil(element / speed)
            timeResult += time
        }
        return timeResult
    }
    while (left < right) {
        const mid = Math.floor((left + right) / 2)
        if (timeRequired(mid) <= h) {
            right = mid
        } else {
            left = mid + 1
        }
    }
    return left
}
console.log(minEatingSpeed([3, 6, 7, 11], 8)); // 4